#pragma once


#include "IEscena.h"
#include "Actor.h"
#include "Mapa.h"
#include "TriggerEntrada.h"
#include "qbase.h"
#include "Path.h"
//#include "PathFinder.h"

enum TipoEvento{
	RATON_BOTON_PULSADO,
	RATON_BOTON_SOLTADO,	
	TECLA_PULSADA,
	TECLA_SOLTADA,
	SALIR_JUEGO,
	RATON_MOVIDO,
	RESOLUCION_CAMBIADA,
	CARGANDO_ESCENA,
	TRIGGER_ENTRADA,
	NUEVO_ACTOR,
	ACTOR_BORRADO,
	CARGANDO_MAPA,
	ACTOR_MOVIDO,
	NPC_CLICKED,
	QUEST_ACEPTADA,
	PETICION_RUTA,
	RUTA_GENERADA
	};

class Event
	{
	public:		
		void *datos;
		TipoEvento tipo;
		Event(TipoEvento t,void *data = NULL): tipo(t),datos(data){};
		~Event(void){delete datos;}
	};

//al producirse un evento relacionado con el teclado.
typedef struct _eventoTeclado{
	_eventoTeclado(int posx, int posy, char key):x(posx),y(posy),tecla(key){};
	int x, y;
	char tecla;
}eventoTeclado;

//al producirse un cambio de resolucion
typedef struct _eventoResolucion{
	_eventoResolucion(int ANCHO, int ALTO):ancho(ANCHO),alto(ALTO){};;
	int ancho;
	int alto;
}eventoResolucion;

//al producirse un cambio de escena
typedef struct _eventoCargarEscena{
	_eventoCargarEscena(IEscena *E):escena(E){};
	IEscena *escena;
}eventoCargarEscena;

//al producirse un nuevo actor
typedef struct _eventoNuevoActor{
	_eventoNuevoActor(Actor *a):actor(a){};
	Actor *actor;
}eventoNuevoActor;

//al cargar un mapa
typedef struct _eventoCargaMapa{
	_eventoCargaMapa(Mapa *m):map(m){};
	Mapa *map;
}eventoCargaMapa;

//al entrar en trigger de entrada
typedef struct _eventoTriggerEntrada{
	_eventoTriggerEntrada(TriggerEntrada *trigger, std::string sp):t(trigger),spawn(sp){};
	TriggerEntrada *t;
	std::string spawn;
	}eventoTriggerEntrada;

//al mover el raton

typedef struct _eventoMovimientoRaton{
	_eventoMovimientoRaton(int x1, int y1):x(x1),y(y1){};
	int x;
	int y;
}eventoMovimientoRaton;

//al pulsar un boton del raton

typedef struct _eventoPulsacionRaton{
	_eventoPulsacionRaton(int boton1, int x1, int y1):boton(boton1),x(x1),y(y1){};
	int boton;
	int x,y;
	}eventoPulsacionRaton;

//al moverse un actor

typedef struct _eventoActorMovido{
	_eventoActorMovido(Actor *a,float destinox, float destinoy):actor(a),destinoX(destinox),destinoY(destinoy){};
	Actor* actor;
	float destinoX;
	float destinoY;
	}eventoActorMovido;

//
typedef struct _eventoNPCclicked{
	_eventoNPCclicked(Actor *a):actor(a){};
	Actor *actor;
	}eventoNPCclicked;


typedef struct _eventoQuestAceptada{
	_eventoQuestAceptada(qbase *q):qt(q){};
	qbase *qt;
	}eventoQuestAceptada;

//AL pedir una ruta

typedef struct _eventoPeticionRuta{
	_eventoPeticionRuta(Actor *a, int x1,int y1, int x2, int y2):actor(a),inicioX(x1),inicioY(y1),destinoX(x2),destinoY(y2){};
	Actor *actor;
	int inicioX;
	int inicioY;
	int destinoX;
	int destinoY;
}eventoPeticionRuta;

typedef struct _eventoRutaGenerada{
	_eventoRutaGenerada(ID idActor, Path *r,int state):actor(idActor),ruta(r),estado(state){};
	ID actor;
	int estado;
	Path *ruta;

}eventoRutaGenerada;